I am of the opinion that you should implement both versions, because you need them.
If you didn't have both versions, how wrong would this program be?
Code:
#include <vector>
#include <iostream>
int main()
{
const std::vector<int> foo(10, 42); // create ten 42s
foo[1] = 40; // can't change them!
std::vector<int> bar(10, 42);
bar[1] = 40; // except when they're not const
}
It is extremely likely that both versions of the subscript operator are apparently the same. This is because the subscript operator has a simple meaning.